約 4,282,352 件
https://w.atwiki.jp/abwiki/pages/399.html
/***********************************************************contfrac.c -- 連分数***********************************************************/#N88BASICSub contfrac(x As Double, n As Long, b As *Long)Dim i As Longb[0] = Fix(x)For i = 1 To nx = 1 / (x - b[i - 1])b[i] = Fix(x)NextEnd SubFunction gcd(x As Long, y As Long) As LongDim t As LongWhile (y 0) t = x Mod y x = y y = tWendgcd = xEnd FunctionSub reduce_cf(n As Long, b As *Long)Dim i As LongDim f As Long, g As Long, temp As Long, d As Longf = b[n] g = 1For i = n - 1 To 0 Step -1temp = b[i] * f + g g = f f = tempd = gcd(f, g) f = f / d g = g / dNextPrint f ;"/"; g ;"="; f / gEnd SubConst N = 17Dim i As LongDim b[N] As Long/* e = 2.718...の連分数展開 */contfrac(2.71828182845904524, N, b)Print "e = [";For i = 0 To N Print b[i];",";NextPrint "...]"/* ふつうの分数と実数に直す */reduce_cf(N, b)
https://w.atwiki.jp/abwiki/pages/452.html
前回は素のwaveファイルお再生しました。 これを使えばほかのものでも応用ができます。 今回はmp3をやります。 mp3はデコーダやプレイやがあって今さらですけど、 ABでもできるんですよ。 今回使うのは定番のmpglib.dllです。 mpglib.dllのある場所http //mpesch3.de1.cc/misc.html こいつはABから使うことを想定していないしドキュメントも不親切です だから元となったmpg123というライブラリも調べてみるといいかもしれませんね。 まずこのDLLは3つの関数しかないので、簡単ですけど、便利な昨日がないので 自分で作ります。 ID3V2も自力で読み飛ばさないといけません。 abmpglib.abp Const AUDIOBUFSIZE = 16384Const SBLIMIT = 32Const SSLIMIT = 18Const SCALE_BLOCK = 12 /* Layer 2 */Const MPG_MD_STEREO = 0Const MPG_MD_JOINT_STEREO = 1Const MPG_MD_DUAL_CHANNEL = 2Const MPG_MD_MONO = 3Const MAXFRAMESIZE = 1792Const MP3_ERR = -1Const MP3_OK = 0Const MP3_NEED_MORE = 1Type al_tablebits As Wordd As WordEnd TypeType framestereo As Longjsbound As Longsingle As Longlsf As Longmpeg25 As Longheader_change As Longlay As Longerror_protection As Longbitrate_index As Longsampling_frequency As Longpadding As Longextension As Longmode As Longmode_ext As Longcopyright As Longoriginal As Longemphasis As Longframesize As Long /* computed framesize */II_sblimit As Long /* Layer 2 */alloc As *al_table /* Layer 2 */do_layer As VoidPtr /* Layer 2 */End TypeType mpglib_bufpnt As *Bytesize As Longpos As Longpnext As *mpglib_bufprev As *mpglib_bufEnd TypeType framebufbuf As *mpglib_bufpos As Longpnext As *frameprev As *frameEnd TypeType mpstrhead As *mpglib_buftail As *mpglib_bufbsize As Longframesize As Longfsizeold As Longfr As framebsspace[ELM(2*(MAXFRAMESIZE+512))] As Byte /* MAXFRAMESIZE */hybrid_block[ELM(2*2*SBLIMIT*SSLIMIT)] As Singlehybrid_blc[ELM(2)] As Longheader As DWord bsnum As Longsynth_buffs[ELM(2*2* h110)] As Singlesynth_bo As LongEnd TypeType ID3V2ID3[2] As Bytemajorversion As Byterevision As Byteflag As Bytesize[3] As ByteEnd TypeDeclare Function InitMP3 CDECL Lib"mpglib.dll" Alias "_InitMP3" (mp As *mpstr) As LongDeclare Sub ExitMP3 CDECL Lib"mpglib.dll" Alias "_ExitMP3" (mp As *mpstr)Declare Function decodeMP3 CDECL Lib"mpglib.dll" Alias "_decodeMP3" (mp As *mpstr, inmemory As *Byte, inmemsize As Long, outmemory As *Byte, outmemsize As Long, done As *Long) As LongDim br_tbl[1,14] = [[ 0, 32, 40, 48, 56, 64, 80, 96,112,128,160,192,224,256,320],[ 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160]] As LongDim rate_tbl[9] = [44100, 48000, 32000, 22050, 24000, 16000 , 11025 , 12000 , 8000, 0] As Long'ID3V2のサイズを詰めるFunction unpack_sint28 (ptr As *Byte) As DWordDim value As DWordIf (ptr[0] And h80) Then Exit Functionvalue = value Or (ptr[0] And h7f)value = (value 7) Or (ptr[1] And h7f)value = (value 7) Or (ptr[2] And h7f)value = (value 7) Or (ptr[3] And h7f)unpack_sint28 = valueEnd FunctionType ABMP3DEC_CTXmp As mpstrbuf[AUDIOBUFSIZE] As BytehF As HANDLErate As Longch As Longpcmb As DWordstartpos As DWordmore As Longstatus As LongEnd TypeDim mc As ABMP3DEC_CTX'mp3ファイルを開いてデコード準備Function OpenMp3(mp3file As *Byte) As LongDim size As LongDim out[8192] As ByteDim len As LongDim ret As LongDim id3 As ID3V2If mc.status = TRUE Then Exit FunctionZeroMemory(VarPtr(mc), SizeOf(ABMP3DEC_CTX))mc.hF = CreateFile(mp3file, GENERIC_READ, FILE_SHARE_READ, ByVal 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)If mc.hF = INVALID_HANDLE_VALUE Then Exit Function'ID3V2ReadFile(mc.hF, VarPtr(id3), SizeOf(ID3V2), VarPtr(len), ByVal 0)If strstr(id3.ID3, "ID3") ThenIf Not (id3.size[0] And h80) Then mc.startpos = unpack_sint28(id3.size)+10 End IfSetFilePointer(mc.hF, mc.startpos, 0, FILE_BEGIN)InitMP3(VarPtr(mc.mp))'一度読み込んでフォーマットを取得If ReadFile(mc.hF, mc.buf, 1024, VarPtr(len), ByVal 0) = FALSE Or len = 0 Then'読み込みエラーEnd Ifret = decodeMP3(VarPtr(mc.mp), mc.buf, len, out, 8192, VarPtr(size))If ret MP3_OK Then'デコードエラーEnd Ifmc.rate = rate_tbl[mc.mp.fr.sampling_frequency]mc.ch = mc.mp.fr.stereo'リセットSetFilePointer(mc.hF, mc.startpos, 0, FILE_BEGIN)ExitMP3(VarPtr(mc.mp))InitMP3(VarPtr(mc.mp))mc.status = TRUEOpenMp3 = TRUEEnd Function'サンプリングレート、チャンネル数を得るFunction GetFormat(rate As *Long, ch As *Long) As LongIf mc.status = FALSE Then Exit FunctionSetDWord(rate, mc.rate)SetDWord(ch, mc.ch)End Function'デコードし、そのサイズを返す。Function ReadMp3(pcm As *Byte, buflen As Long) As DWordDim pos As DWordDim len As DWordDim siz As DWordDim ret As LongIf mc.status = FALSE Then Exit Functionpos = 0siz = 0Do If mc.more = FALSE Thenret = ReadFile(mc.hF, mc.buf, 16384, VarPtr(len), ByVal 0)If ret = FALSE Or len = 0 Then *JUMPret = decodeMP3(VarPtr(mc.mp), mc.buf, len, VarPtr(pcm[pos]), 8192, VarPtr(siz))If ret = MP3_OK Then mc.more = TRUEEnd IfWhile (ret = MP3_OK)pos = pos + sizIf pos+8192 buflen Then *JUMPret = decodeMP3(VarPtr(mc.mp), NULL, 0, VarPtr(pcm[pos]), 8192, VarPtr(siz))Wendmc.more = FALSE'次に読み込みが必要Loop While pos+8192 buflen*JUMPReadMp3 = posmc.pcmb = mc.pcmb + posEnd Function'終わりFunction CloseMp3() As LongIf mc.status = FALSE Then Exit FunctionCloseHandle(mc.hF)ExitMP3(VarPtr(mc.mp))mc.status = FALSEEnd Function つぎに再生部 #include api_mmsys.sbp #include "abmpglib.abp"Declare Function waveOutOpen Lib "winmm" (phwo As *HWAVEOUT, uDeviceID As DWord, pwfx As *WAVEFORMATEX, dwCallback As DWord, dwInstance As DWord, fdwOpen As DWord) As MMRESULTDeclare Function waveOutClose Lib "winmm" (hwo As HWAVEOUT) As MMRESULTDeclare Function waveOutPrepareHeader Lib "winmm" (hwo As HWAVEOUT, pwh As *WAVEHDR, cbwh As DWord) As MMRESULTDeclare Function waveOutUnprepareHeader Lib "winmm" (hwo As HWAVEOUT, pwh As *WAVEHDR, cbwh As DWord) As MMRESULTDeclare Function waveOutWrite Lib "winmm" (hwo As HWAVEOUT, pwh As *WAVEHDR, cbwh As DWord) As MMRESULTDeclare Function waveOutPause Lib "winmm" (hwo As HWAVEOUT) As MMRESULTDeclare Function waveOutRestart Lib "winmm" (hwo As HWAVEOUT) As MMRESULTDeclare Function waveOutReset Lib "winmm" (hwo As HWAVEOUT) As MMRESULTDeclare Function waveOutGetPosition Lib "winmm" (hwo As HWAVEOUT, pmmt As *MMTIME, cbmmt As DWord) As MMRESULTDeclare Function MulDiv Lib "kernel32" (nNumber As Long, nNumerator As Long, nDenominator As Long) As LongConst WAVE_MAPPER = (-1)Const CALLBACK_FUNCTION = H00030000lConst WOM_OPEN = H3BBConst WOM_CLOSE = H3BCConst WOM_DONE = H3BDConst WHDR_DONE = H00000001Const WHDR_PREPARED = H00000002Const WHDR_BEGINLOOP = H00000004Const WHDR_ENDLOOP = H00000008Const WHDR_INQUEUE = H00000010Const TIME_MS = H0001Const TIME_SAMPLES = H0002Const TIME_BYTES = H0004Const TIME_SMPTE = H0008Const TIME_MIDI = H0010Const TIME_TICKS = H0020TypeDef MMRESULT = DWordTypedef HWAVEOUT = VoidPtrType WAVEHDR lpData As *Byte dwBufferLength As DWord dwBytesRecorded As DWord dwUser As DWord dwFlags As DWord dwLoops As DWord lpNext As *WAVEHDR reserved As *DWord End TypeType MMTIMEwType As DWordu As DWordu2 As DWordEnd TypeClass Mp3PlayerPrivatebuffer[2] As *Bytehwo As HWAVEOUTwfe As WAVEFORMATEXswitch As LongFunction GetMp3Header() As LongDim head[3] As ByteDim r As DWordDim c As DWordGetFormat(VarPtr(r), VarPtr(c))wfe.wFormatTag = 1wfe.nChannels = cwfe.nSamplesPerSec = rwfe.wBitsPerSample = 16wfe.cbSize = Sizeof(WAVEFORMATEX)wfe.nBlockAlign = wfe.nChannels * wfe.wBitsPerSample/8wfe.nAvgBytesPerSec = wfe.nSamplesPerSec * wfe.nBlockAlignGetMp3Header = 1End FunctionSub waveOutProc(hwo As HWAVEOUT, uMsg As DWord, dwInstance As *DWord, dwParam1 As DWord, dwParam2 As DWord)Dim x As *Mp3Playerx = dwInstanceSelect Case uMsgCase WOM_CLOSECase WOM_DONEx- wh[1].dwUser = x- wh[1].dwUser - 1If x- wh[0].dwUser = 0 Then x- read(hwo)Case WOM_OPENEnd SelectEnd SubPublicwh[2] As WAVEHDRSub read(hwo As HWAVEOUT)Dim r As DWordIf hwo = NULL Or wh[0].dwUser = 1 Or wh[1].dwUser 1 Then Exit SubwaveOutUnprepareHeader(hwo, VarPtr(wh[switch]), SizeOf(WAVEHDR))r = ReadMp3(buffer[switch], wfe.nAvgBytesPerSec)wh[switch].lpData = buffer[switch]wh[switch].dwBufferLength = rIf r = 0 Then wh[0].dwUser = 1'これ以上再生しませんwaveOutPrepareHeader(hwo, VarPtr(wh[switch]), SizeOf(WAVEHDR))waveOutWrite(hwo, VarPtr(wh[switch]), SizeOf(WAVEHDR))wh[1].dwUser = wh[1].dwUser + 1switch = switch + 1If switch = 2 Then switch = 0End SubFunction play(infile As *Byte) As LongIf hwo NULL Then Exit FunctionIf OpenMp3(infile) = FALSE Then Exit FunctionIf GetMp3Header() = 0 ThenCloseMp3()Exit FunctionEnd Ifbuffer[0] = malloc(wfe.nAvgBytesPerSec)buffer[1] = malloc(wfe.nAvgBytesPerSec)waveOutOpen( VarPtr(hwo), WAVE_MAPPER, VarPtr(wfe), AddressOf(waveOutProc) ,VarPtr(this), CALLBACK_FUNCTION)read(hwo)Sleep(500)read(hwo)play = 1End FunctionSub stop() As LongIf hwo = NULL Then Exit Subwh[0].dwUser = 1waveOutReset(hwo)While wh[1].dwUser 0Sleep(1)WendwaveOutUnprepareHeader(hwo, VarPtr(wh[0]), SizeOf(WAVEHDR))waveOutUnprepareHeader(hwo, VarPtr(wh[0]), SizeOf(WAVEHDR))free(buffer[0])free(buffer[1])waveOutClose(hwo)CloseMp3()hwo = NULLEnd SubFunction state(t As *DWord) As Longstate = wh[1].dwUserIf t = NULL Then Exit FunctionDim mmt As MMTIMEmmt.wType = TIME_SAMPLESwaveOutGetPosition(hwo, VarPtr(mmt), SizeOf(MMTIME))SetDWord(t,MulDiv(mmt.u , 1000, wfe.nSamplesPerSec))End FunctionEnd Class#define SELFTEST#ifdef SELFTEST#N88BASICDim wp As Mp3PlayerDim time As DWordPrint "再生"wp.play("test.mp2")While wp.state(VarPtr(time))Locate 4,1Print time\1000;"sec"Sleep(1000)Wendwp.stop()Print "停止"#endif ファイル名は好きに変えるようにして、 美しい音楽が聴こえてくるはずです。
https://w.atwiki.jp/tryo/pages/28.html
2007/11/28 OpenOffice.orgの開発ガイド 1363%5B1%5D.gif 2007/11/26 Unoなどについての参考サイト 2007/9/27 Basicの参考サイト 2007/9/26 RCalcが動かない! 2007/11/28 OpenOffice.orgの開発ガイド 1363%5B1%5D.gif Basicの関数のメソッドはまったく意味がわからない!!!!!(><#)ので、デモファイルを解読しようもできなくて・・・ 使えそうな資料(サイト): StarSuite 8 Basicプログラミングガイド第 4 章 StarSuite API について OpenOffice.org Developer s Guide←もうエイゴは勘弁してほしかったのに(T。T)がんばってみます>< 2007/11/26 Unoなどについての参考サイト UNOで広がるOpenOffice.orgの世界.pdf(著者は中本 崇志さん) OpenOffice.orgにアドオンを登録.pdf(著者は鎌滝 雅久さん) OpenOffice.orgの使い方 2007/9/27 Basicの参考サイト Basicプログラミング関係 StarSuite 8 Basic プログラミングガイド(HP) StarSuite 8 Basic プログラミングガイド(PDF) OpenOffice.org 初めての人へ OpenOffice.org ガイド オープンガイドブック OpenOffice.org2.0公開版 ver0.0.1のダウンロード(ZIP形式, 9.3MB) 簡単な使い方マニュアル(窓の杜にとぶ) 2007/9/26 RCalcが動かない! まずは,OooとRをつないで計算するサンプルファイル「RDemoDens」を動かせたい!><;なぜうまく動かないのでしょう~~ 「Cannot load RProxy」というエラーメッセージが出る! 可能性その一:(R(D)COM/RCOM解説)より 複数のRのバージョンがインストールされているとRDCOMがうまく動かない カレントのバージョン指定をしないとRDCOMは上手く動かないことがある。~ (1) bin内のRSetReg.exeを実行すると、そのバージョンがカレントになる。~ (2) http //code.google.com/p/batchfiles/からRversions.htaをダウンロードし、実行させると任意のカレントバージョンの設定ができる。~ 可能性その二:(Index for R(D)COM Sever)より R プロキシライブラリがロードされていない。この原因は以下のようなものである: * 1. 環境変数 %R_HOME% が、 R がインストールされていないディレクトリを示しており、 * 2.R のインストールに対応するレジストリキーが R のフォルダを指しておらず、 * 3.rproxy.dll 及び R.dll が %PATH% 内に見つからない。 R を CRAN からバイナリをダウンロードし、インストールした場合には、それが何か悪かったのかもしれない。セットアッププログラムを用いて再インストールを試みてほしい。また、何が問題なのかを発見するために "dbgview"(see section "Resources" セクションを参照のこと)をダウンロードすること。 自分自身で R をコンパイルしたのであれば、 %R_HOME%\bin\rproxy.dll を確認しレジストリキー HKEY_LOCAL_MACHINE\Software\R-core\R\InstallPath が R がインストールされているフォルダを指しているかを確認すること。R 2.2.0 からはレジストリキーは HKEY_CURRENT_USER\Software\R-core\R\InstallPath も用いている。R (D)COM サーバはまず HKEY_CURRENT_USER 下を探す。 レジストリキーが失われていているか間違っている場合は、R に関する情報をレジストリに書き込むボックスがチェックされていることを忘れずに再インストールすること。または RSetReg.exe をコマンドウィンドウで呼び出すこと。 調べてみると: 可能性その一に対して:(1)も(2)も試してみたが効果が見られない>< 可能性その二に対して: * 1.問題はなかった * 2.レジストリキーと言う単語から分からない><また調べてみるが・・ * 3.これも問題ないと思うけど・・・ 何ででしょう・・・(T_T) 名前 コメント ファイルメニュー -> パッケージ -> パッケージのインストールから、rcomとRExcelInstallerをインストールしてはいかがでしょうか? -- とおりすがりのもの (2009-01-09 11 00 23) HTMLの禁止文字をつかってしましました。 -- 名無しさん (2009-01-09 10 58 54) Rのバージョンにもよりますが、ファイルメニューの quotパッケージ quot- quotパッケージのインストール quotから、rcomとRExcelInstallerをインストールしてはいかがでしょうか? -- とおりすがりのもの (2008-12-25 16 52 00)
https://w.atwiki.jp/abwiki/pages/316.html
関数(かんすう)とは、functionの言い換え。 数学の関数とは微妙に違う。 たくさんの命令にわかりやすい名前をつけたもの。 関数を使うことでプログラムの見通しを良くしたり、再利用が可能になる。 昔のBASICでDEF FNなる関数定義の命令があったけど 現在に関数はどちらかと言えばGoSub~Returnに近い挙動。
https://w.atwiki.jp/abwiki/pages/182.html
#N88BASICDeclare Function GetPrivateProfileInt Lib "kernel32" Alias "GetPrivateProfileIntA" _ ( lpApplicationName As BytePtr, _ lpKeyName As BytePtr, _ nDefault As Long, _ lpFileName As BytePtr) As LongDeclare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _ ( lpApplicationName As BytePtr, _ lpKeyName As VoidPtr, _ lpDefault As BytePtr, _ lpReturnedString As BytePtr, _ nSize As Long, _ lpFileName As BytePtr) As LongDeclare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" _ ( lpApplicationName As BytePtr, _ lpKeyName As VoidPtr, _ lpString As VoidPtr, _ lpFileName As BytePtr) As Long'ファイル名だけだとWINDOUSフォルダにつくってしまうConst IniFile = ".\平井公彦.ini"Dim s[20] As ByteDim d As LongWritePrivateProfileString("kuki-yuuki-aki", "Kimihiko", "( ̄ー+ ̄)キラリ", IniFile)'Iniファイルは文字列にしないとカキコできない!d=090-7777-7777wsprintf(s, "%d", d)WritePrivateProfileString("kuki-yuuki-aki", "Kimihiko2", s, IniFile)GetPrivateProfileString("kuki-yuuki-aki", "Kimihiko", "?",s,20,IniFile)Print MakeStr(s)d = GetPrivateProfileInt("kuki-yuuki-aki", "Kimihiko2", 64,IniFile)Print d
https://w.atwiki.jp/abwiki/pages/374.html
N88BASICでグラフィック命令を覚えたら 最初に作るのが花火 '綺麗な花火#N88BASICCONST PI = 3.1416Const BASE = 380Dim x As Long, y As LongDim yy As Long, r As LongDim c As Long, k As DoubleDim p As LongDim ax As Long, ay As LongRandomizeCls 3Line(0,BASE)-(640,BASE)*LLLx = 70+Rnd()*500yy = 50+Rnd()*50'For y=BASE-2 To yy Step -1Circle(x,y),2,7Sleep(5)Circle(x,y),2,0Nextp = Rnd() * 4Select Case pCase 0For r=10 To 50 Step 2Circle(x,y),r,Rnd()*7+1Sleep(40)Circle(x,y),r,0NextCase 1For k=0 To PI*2 Step PI/15ax = x + 10*k * Cos(k)ay = y - 10*k * Sin(k)Line(x,y)-(ax,ay),Rnd()*7+1Sleep(40)Line(x,y)-(ax,ay),0NextCase 2For k=0 To PI*2 Step PI/15ax = x + 10*k * Cos(k)ay = y + 10*k * Sin(k)Line(x,y)-(ax,ay),Rnd()*7+1Sleep(40)Line(x,y)-(ax,ay),0NextCase 3For k=0 To 100ax = x + 100 * Rnd() -50ay = y + 100 * Rnd() -50Circle(ax,ay),2,Rnd()*7+1Sleep(10)Circle(ax,ay),2,0NextEnd SelectGoto *LLL
https://w.atwiki.jp/abwiki/pages/258.html
/***********************************************************strmatch.c -- 文字列照合***********************************************************/Function position(text As *Byte, pattern As *Byte) As LongDim i As Long, j As Long, k As Long, c As Longc = pattern[0] i = 0while (text[i] 0) if (text[i] = c) Thenk = i+1 j = 1while (text[k] = pattern[j]) And (pattern[j] 0)k++ j++Wendif (pattern[j] = 0) Thenposition= k - j /* 見つかった */Exit FunctionEnd IfEnd Ifi++Wendposition = -1 /* 見つからなかった */End Function#N88BASICDim i As LongDim text = "私の名前は平井公彦" As *ByteDim pattern[3] = ["私の", "名前は", "平井公彦", "阿部高和"] As *Byte Dim out[100] As ByteFor i=0 To 3wsprintf(out, Ex"position(\q%s\q, \q%s\q) = %d\n", text, pattern[i], position(text, pattern[i]))Print MakeStr(out)Next
https://w.atwiki.jp/abwiki/pages/400.html
/***********************************************************eulerian.c -- Euler (オイラー) の数***********************************************************/Function Eulerian(n As Long,k As Long) As LongIf (k = 0) Then Eulerian = 1 Exit FunctionIf (k 0 Or k = n) Then Eulerian = 0 Exit FunctionEulerian = (k + 1) * Eulerian(n - 1, k) + (n - k) * Eulerian(n - 1, k - 1)End Function#N88BASICDim n As Long,k As LongPrint " k";For k=0 To 8 Print k;" "; NextPrint ""Print "n ";For k=0 To 8 Print "------"; NextPrint ""For n=0 To 8Print n;"| ";For k=0 To 8 Print Eulerian(n, k);" "; NextPrint ""Next
https://w.atwiki.jp/abwiki/pages/23.html
クラスは、次のように作る。 Class C private A As Long public Sub C() A=1 End Sub Sub ~C() End Sub Function Member1() As Long Member1=A End Functoin End Class ここでクラス名がCなら、コンストラクタ(生成時に1度だけ呼ばれる関数)の名前はC、デストラクタ(開放時に1度だけ呼ばれる関数)の名前は~Cとなる。 public と書いてあるが、これはpublicアクセスの開始を宣言するもので、クラスの中からは勿論、クラスの外からも使うことが出来る事を意味する。 コンストラクタとデストラクタはこのpublicアクセスの中で定義する必要がある。 一方private と書いてあるが、これはprivateアクセスの開始を宣言するもので、このクラスの外からは一切参照できなくなる。 外から勝手に書き換えられたくない場合に用いる。 他にprotected と書くものがあり、これはprotectedアクセスの開始を宣言するもので、protectedアクセスの中の変数や関数は、このクラスとこのクラスの派生先のクラスで参照できる。ただしそれ以外の場所からは参照できない。 ちなみにClass開始時はprivateアクセスになるので、先頭に書く場合はprivate は省略できる。 使う時はこのクラスの型か、そのポインタ型等として宣言する。 Dim A As C Dim B As Long B = A.Member1() Dim A As *C Dim B As Long A = new C B = A- Member1() delete A 等と書ける。尚、ポインタでない型として宣言した場合、宣言した直後にコンストラクタが呼ばれる。 継承の例 #N88BASIC Class Idol Protected charisma As Long looks As Long Public Sub talk() Print "アイドル" End Sub End Class Class KAT_TUN Inherits Idol Public Sub talk() Print "田中聖" End Sub End Class Dim Kouki As KAT_TUN Kouki.talk()
https://w.atwiki.jp/startruby/pages/21.html
ブラックボックス?ステートボックス? どちらかというと設計に該当する考え方。しかし、そのコードに与える影響の強さは、フローチャート以上。 ブラックボックスやステートボックスの考え方自体は、構造化手法とそれに伴うモジュール化の時代から存在している。 ブラックボックス・テスト? ブラックボックスとは、あるクラスの公開アクセッサに注視して、そのインタフェースを明らかにすること。 じっさいのコードやオブジェクトの状態は考慮に入れないで行う。 クラス そのクラスの公開されている部分(メソッドやプロパティ等)が、外部からアクセス可能になっていること。 メソッド/プロパティ そのメソッドのIN値が明らかになっていること。 IN値に閾値があるときは、それの範囲 IN値に特値(特別な値)があるときは、その値 IN値がオブジェクトの場合:そのステートに制限があるときは、ステート IN値が対象外のときの動作が明らかになっていること。 例外の発行 単なる無動作 IN値を与えたときのOUT値が明らかになっていること。 IN値に閾値があるときは、とくにその境界値のOUT値 IN値に特値があるときは、その場合のOUT値 クラスにステートがあり、それによりOUT値が左右される場合は、ステート別のOUT値 ステートボックス・テスト? ステートボックスとは、あるクラスのオブジェクトのステートやそのクラスが他に及ぼす影響に注視して、そのステート・影響を明らかにすること。 じっさいのコードは考慮に入れないで行う。 クラス そのクラス(オブジェクト)のステートと遷移が明らかになっていること。 メソッド そのメソッドによる、クラス(オブジェクト)のステートの変更が明らかになっていること。 IN値によるステートの変化値 IN値と現ステートの組み合わせによるステートの変化値 そのメソッドによる、外部への影響が明らかになっていること。 DBやファイル等、記録媒体への影響 システム的なオブジェクトなど、自身に管理権限のない他のオブジェクトへの影響 そのメソッドでおこる、外部からの影響が明らかになっていること。 DBやファイル等、記録媒体からの影響 システム的なオブジェクトなど、自身に管理権限のない他のオブジェクトからの影響 これらのインタフェースを意識していくと しぜんに、次のような設計を心がけるようになっていく。 メソッドの引数には、なるべく閾値を設けない。設ける場合も、列挙(enum)を使うなどして閾値外にならないように工夫する。 クラスのステートは、必要最低限に構成するようになる。複数のステートが絡み複雑になる場合は、クラス分けを考え出す。 外部への影響は、なるべく排除するように考え出す。外部からの影響(変更可能性)も必要最低限へ。 TDDではどう扱うか? どうテストを書いたらいいかわからなくなった!そんな時の指針になる。 ただし、あまりガチガチに縛られないように。